package com.my.config;

import com.my.constant.Constant;
import com.my.utils.RequestTokenUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

/**
 * @Author coderMy
 * @Date 2021/3/30
 */

/**
 * 对openfeign每次远程调用都进行一个拦截,主要原因是每个资源服务器都需要token,但是很多时候没有token,所以必须在这里处理一下.
 * 有token的情况,就让其携带到下个服务中.
 *
 * 情况1.浏览器携带token -->A服务 -->B服务   这是正常情况
 * 情况2.应用本身自发的请求   MQ -->A服务 -->B服务  此时没有token
 * 情况3.支付宝回调 ,在回调方法中需要远程调用
 * 以上几种情况,均是合法行为,我们必须为其颁发一个永久token,让其调用不受影响.
 * 这个token就是客户端授权,token中未包含任何用户信息和权限信息,仅是通行而已
 */
@Configuration
public class TokenOpenfeignInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {

        //获取请求头中的token
        String requestToken = RequestTokenUtil.getRequestToken();

        //携带到远程调用的服务去
        if (StringUtils.hasText(requestToken)){

            requestTemplate.header(Constant.HEADER_TOKEN_KEY,requestToken);
        }else {

            //制造一个永久的token
            requestTemplate.header(Constant.HEADER_TOKEN_KEY,Constant.FOREVER_TOKEN);
        }
    }
}
